//
//  LLUserAccountViewModel.swift
//  LLWeibo09
//
//  Created by 林 on 16/3/30.
//  Copyright © 2016年 lin. All rights reserved.
//

import UIKit

/// VM专门来负责模型相关的操作
class LLUserAccountViewModel: NSObject {
    // 单例
    static let shareInstance: LLUserAccountViewModel = LLUserAccountViewModel()
    
    private override init() {
        super.init()
        
        // 从沙盒里面加载账号
        userAccount = loadUserAccount()
    }
    
    // 账号的路径
    private let accountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/account.plist")
    
    // 账号
    var userAccount: LLUserAccount?
    
    // 是否登陆,只读计算型属性
    var userLogin: Bool {
        get {
            return userAccount != nil
        }
    }
    
    /// 加载 access_token ,post
    // 1. 定义闭包 completion: (error: NSError?) -> ()
    func loadAccessToken(code: String, completion: (error: NSError?) -> ()) {
    // 获取accessToken的url
    let urlString = "https://api.weibo.com/oauth2/access_token"
    
    // 拼接参数
    let parameters = [
        "client_id" : client_id,
        "client_secret" : client_secret,
        "grant_type" : "authorization_code",
        "code" : code,
        "redirect_uri" : redirect_uri
    ]
    
    // 发送请求
    /*
    AFN.POST:
    1.请求的url地址
    2.请求参数
    */
//        LLNetworkTool.sharedInstance.requestPOST(urlString, parameters: parameters, success: { (re) -> Void in
//            // 将accessToken保存起来,下次直接拿来用,省得用户每次进入都需要登录
//            if let dict = result as? [String: AnyObject] {
//                
//                // 将网络返回的账号赋值给属性,别人直接访问属性
//                self.userAccount = LLUserAccount(dict: dict)
//                
//                /// 保存模型到沙盒
//                self.saveUserAccount()
//                
//                // 2.通知控制器保存完成
//                completion(error: nil)
//            }
//            }) { (_,error) -> Void in // 1.task 2.响应失败的原因
//                // 2.通知控制器出现了错误
//                completion(error: error)
//        }
//    
//    }
        
        LLNetworkTool.sharedInstance.requestPOST(urlString, parameters: parameters) { (result, error) -> () in
            if error != nil {
                // 表示网络请求出错了
                // 2.通知控制器出现了错误
                completion(error: error)
                return
            }
            
            // 获取到结果没有出错
            // 将accessToken保存起来,下次直接拿来用,省得用户每次进入都需要登录
            // 将网络返回的账号赋值给属性,别人直接访问属性
            self.userAccount = LLUserAccount(dict: result!)
            
            /// 保存模型到沙盒
            self.saveUserAccount()
            
            // 2.通知控制器保存完成
            completion(error: nil)
        }
    }
    
    /// 获取用户信息
    func loadUserInfo(completion: (error: NSError?) -> ()) {
        // url
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 参数
        let parameters: [String: AnyObject] = [
            "access_token": userAccount!.access_token!,
            "uid": userAccount!.uid!
        ]
        
        // 发送请求
//        LLNetworkTool.sharedInstance.afnManager.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in // 成功的回调, 返回的数据都在result里面,只需要 screen_name
//            // result实际上是一个JSON -> iOS里面的字典
//            let dict = result as? [String: AnyObject]
//            
//            // 给账号赋值
//            self.userAccount?.screen_name = dict?["screen_name"] as? String
//            self.userAccount?.avatar_large = dict?["avatar_large"] as? String
//            
//            // 将账号新的数据保存到沙盒
//            self.saveUserAccount()
//            
//            completion(error: nil)
//            
//            }) { (_, error) -> Void in // 失败的回调
//                completion(error: error)
//        }
        LLNetworkTool.sharedInstance.requestGET(urlString, parameters: parameters) { (result, error) -> () in
            if error != nil {
                // 出现了错误
                completion(error: error)
                return
            }
            
            // 给账号赋值
            self.userAccount?.screen_name = result?["screen_name"] as? String
            self.userAccount?.avatar_large = result?["avatar_large"] as? String
            
            // 将账号新的数据保存到沙盒
            self.saveUserAccount()
            
            completion(error:nil)
        }
        
        }
    
    
    
    /// 保存模型到沙盒
    private func saveUserAccount() {
        if userAccount != nil {
            // 有账号才需要保存
            NSKeyedArchiver.archiveRootObject(userAccount!, toFile: accountPath)
        }
    }
    
    /// 从沙盒中加载数据
    private func loadUserAccount() -> LLUserAccount? {
        let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? LLUserAccount
        
        // 如果加载出账号,需要判断accessToken是否过期
        // userAccount?.expiresDate和当前时间判断
        // NSDate()
        // userAccount?.expiresDate > NSDate() 表示没有过期
        // 测试过期时间1.让服务器返回一个过期时间来测试 2.改模拟器时间 3.重新给userAccount?.expiresDate?赋值
        // userAccount?.expiresDate = NSDate(timeIntervalSinceNow: -1000)
        if userAccount != nil && userAccount?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            return userAccount
        }
        
        return nil
    }

}
